// 字面量进行类型声明
let a: 10;
a = 10
console.log(a)
// a = 11 此时就不能赋值了 会报错 有点const的味道

// 或者的意思 可以使用 | 来连接多个类型
// 我们将这个称之为联合类型
let b: "male" | "female"
b = "male"
b = "female"

let c: boolean | string
c = true
c = 'hello'

// any为任意类型 与js相似
// 当一个变量设置了any时，相当于对于该变量关闭了ts的类型检测
// 所以我们不建议使用

// 显示声明
let d: any
// 隐式声明
// let d
d = 10
d = 'hello'
// d = true


// 当我们不知道参数的类型的时候
// 我们可以使用unknown
let e: unknown
e = 10
e = 'hello'
e = true


// exp: 我们可以发现any是会对其他变量产生影响的
let s: string
s = d
// console.log(s) true 竟然可以输出

// 但是unknown 就不会
e = 'hello'

// s = e // 这时就会报错 因为unknow不能赋值给确认类型的变量

// unknown 相当于安全的any

// 若想要不报错 我们可以这样 做一个类型检测
if (typeof e === "string") {
    s = e
}

// 当然 我们也可以这样
// 叫做类型断言 可以用来告诉解析器变量的实际类型
s = e as string
// 或者
s = <string>e



// function fn(): boolean {
//     return true
// }

// 如果函数没有返回值
function fn(): void {
    return null
    return undefined
    // 都是可以的
}


// never表示永远不会返回结果
function fn1(): never {
    throw new Error('报错了')
}